//package com.qianfeng.biquge.service.impl;
//
//
////
////                            _ooOoo_
////                           o8888888o
////                           88" . "88
////                           (| -_- |)
////                            O\ = /O
////                        ____/`---'\____
////                      .   ' \\| |// `.
////                       / \\||| : |||// \
////                     / _||||| -:- |||||- \
////                       | | \\\ - /// | |
////                     | \_| ''\---/'' | |
////                      \ .-\__ `-` ___/-. /
////                   ___`. .' /--.--\ `. . __
////                ."" '< `.___\_<|>_/___.' >'"".
////               | | : `- \`.;`\ _ /`;.`/ - ` : | |
////                 \ \ `-. \_ __\ /__ _/ .-` / /
////         ======`-.____`-.___\_____/___.-`____.-'======
////                            `=---='
////
////         .............................................
////                  佛祖镇楼            BUG辟易
////          佛曰:
////                  写字楼里写字间，写字间里程序员；
////                  程序人员写程序，又拿程序换酒钱。
////                  酒醒只在网上坐，酒醉还来网下眠；
////                  酒醉酒醒日复日，网上网下年复年。
////                  但愿老死电脑间，不愿鞠躬老板前；
////                  奔驰宝马贵者趣，公交自行程序员。
////                  别人笑我忒疯癫，我笑自己命太贱；
//
//
//import com.qianfeng.biquge.mapper.MenuMapper;
//import com.qianfeng.biquge.mapper.RoleMapper;
//import com.qianfeng.biquge.mapper.UserMapper;
//import com.qianfeng.biquge.pojo.Menu;
//import com.qianfeng.biquge.pojo.Role;
//import com.qianfeng.biquge.pojo.User;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.security.core.GrantedAuthority;
//import org.springframework.security.core.authority.SimpleGrantedAuthority;
//import org.springframework.security.core.userdetails.UserDetails;
//import org.springframework.security.core.userdetails.UserDetailsService;
//import org.springframework.security.core.userdetails.UsernameNotFoundException;
//import org.springframework.stereotype.Service;
//import org.springframework.web.context.request.RequestContextHolder;
//import org.springframework.web.context.request.ServletRequestAttributes;
//
//import java.util.ArrayList;
//import java.util.HashSet;
//import java.util.List;
//import java.util.Set;
//import java.util.stream.Collectors;
//
///**
// * Created by jackiechan on 2021/6/18 09:53
// *
// * @author jackiechan
// */
//@Service
//public class MyUserDetailService implements UserDetailsService {
//
//    private UserMapper userMapper;
//
//    private RoleMapper roleMapper;
//
//    private MenuMapper menuMapper;
//
//    @Autowired
//    public void setUserMapper(UserMapper userMapper) {
//        this.userMapper = userMapper;
//    }
//    @Autowired
//    public void setRoleMapper(RoleMapper roleMapper) {
//        this.roleMapper = roleMapper;
//    }
//    @Autowired
//    public void setMenuMapper(MenuMapper menuMapper) {
//        this.menuMapper = menuMapper;
//    }
//
//    @Override
//    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
//        //先按照用户名查询用户相关的信息
//        User user = userMapper.findUsersByName(username);
//        if (user == null) {//用户可能会输入错误账号导致没有这个用户,后面获取密码的话会出现空指针
//            return null;
//        }
//        List<GrantedAuthority> grantedAuthorityList = new ArrayList<>();
//        //根据用户的 id 查询出所有的角色
//        List<Role> roleList = roleMapper.findAllRolesByUserId(user.getId());
//        user.setRoleList(roleList);
//
//        Set<Menu> menuSet = new HashSet<>();//用于保存用户可以访问的列表页面的 set,用 set的原因是用户可能会有多个 role,不同的 role 会有相同的访问地址
//        //再根据用户的角色查询出所有的权限
//        //TODO 正常应该是直接传递所有的 id 过去,然后一次性查出来,但是这样的话 sql 语句会稍微麻烦一 neinei,所以此处是循环遍历每个角色,挨个查询
//        roleList.forEach(role -> {
//            List<Menu> menuList = menuMapper.findMenusByRoleId(role.getId());
//            role.setMenuList(menuList);
//            grantedAuthorityList.add(new SimpleGrantedAuthority("ROLE_" + role.getName()));
////            List<String> dasdasd = new ArrayList<>();
////            for (Menu menu : menuList) {
////                String perms = menu.getPerms();
////                dasdasd.add(perms);
////            }
////            List<SimpleGrantedAuthority> authorityListdasa = new ArrayList<>();
////            for (String s : dasdasd) {
////                SimpleGrantedAuthority simpleGrantedAuthority = new SimpleGrantedAuthority(s);
////                authorityListdasa.add(simpleGrantedAuthority);
////            }
//            //此代码相当于上面注释掉的代码
//            List<SimpleGrantedAuthority> authorityList = menuList.stream().map(Menu::getPerms).map(SimpleGrantedAuthority::new).collect(Collectors.toList());
//            grantedAuthorityList.addAll(authorityList);
//            //我们需要在页面上面展示用户可见的页面列表,所以需要将页面列表单独拿出来,也就是 type 类型为 1 的 menu 对象
//            List<Menu> pageList = menuList.stream().filter(menu -> menu.getType() == 1).collect(Collectors.toList());
//            menuSet.addAll(pageList);//添加到用户可以访问的列表中
//        });
//        //遍历放到新的权限集合
//
//        System.err.println(menuSet);
//
//        ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes())//spring 提供的一个工具类,让我们可以在任意类中获取到当前的请求对象
//                .getRequest().getSession().setAttribute("pagelist",menuSet);
//        //System.err.println("将用户的访问列表保存到 session");
//        //创建 Spring Security 中的 user 对象返回
//        return new org.springframework.security.core.userdetails.User(username,user.getPassword(),grantedAuthorityList);
//    }
//}
